<?php
/**
 * Created by PhpStorm.
 * User: wangjie
 * Date: 2021/01/22
 * Time: 17:49
 */

namespace App\Api\Controllers\YinSheng;


use function EasyWeChat\Kernel\Support\get_client_ip;
use function EasyWeChat\Kernel\Support\get_server_ip;
use Illuminate\Support\Facades\Log;

class PayController extends BaseController
{

    //付款码支付 b_2_c -1系统错误 1-交易成功 2-失败 3-等待买家付款 4-客户主动关闭订单 5-交易正在处理中 6-部分退款成功 7-全部退款成功
    public function scan_pay($data)
    {
        try {
            $seller_id = $data['seller_id'];//商户号
            $partner_id = $data['partner_id']; //服务商户号
            $out_trade_no = $data['out_trade_no']; //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天,且只能由大小写英文字母,数字,下划线及横杠组成
            $ways_source = $data['ways_source']; //
            $body = $data['body']; //商品的标题,交易标题,订单标题,订单关键字等,最长为250个汉字
            $total_amount = $data['total_amount']; //该笔订单的资金总额,单位为RMB-元.取值范围为[0.01,100000000.00],精确到小数点后两位
            $store_name = $data['store_name']; //收款方银盛支付客户名(注册时公司名称)
            $business_code = $data['business_code']; //业务代码
            $code = $data['code']; //扫码支付授权码,设备读取用户展示的条码或者二维码信息
            $device_id = $data['device_id'] ?? ''; //终端设备号.注:当bank_type域为中国银联-9001002时,为必填
            $public_key = isset($data['public_key']) ? app_path('Api/Controllers/YinSheng/') . $data['public_key'] : ''; //验签公钥
            $private_key = isset($data['private_key']) ? app_path('Api/Controllers/YinSheng/') . $data['private_key'] : ''; //加签私钥
            $pfx_password = $data['pfx_password']; //商户私钥证书密码
            $req_data = [
                'method' => 'ysepay.online.barcodepay', //接口类型
                'partner_id' => $partner_id, //
                'timestamp' => date('Y-m-d H:i:s', time()), //32,发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
                'charset' => $this->_charset, //商户网站使用的编码格式
                'sign_type' => $this->_sign_type,
                'notify_url' => url('/api/yinsheng/pay_notify_url'), //银盛支付服务器主动通知商户网站里指定的页面 http 路径，支持多个 url 进行异步通知，多个 url用分隔符“,”分开，格式如：url1,url2,url3
                'version' => $this->_version //接口版本
            ];
            $biz_content = [
                'out_trade_no' => $out_trade_no,
                'shopdate' => $this->datetime2string(date('Ymd')), //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
                'subject' => $body,
                'total_amount' => $total_amount,
                'seller_id' => $seller_id, //收款方银盛支付用户号(商户号)
//                'seller_name' => $store_name,
                'timeout_express' => '15d', //设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭。(需申请业务权限，权限未开通情况下该参数不生效，默认未付款交易的超时时间为 7d).取值范围：1m～15d。m-分钟，h-小时，d-天。该参数数值不接受小数点，如1.5h，可转换为 90m。注意：设置了未付款交易超时时间的情况下，若我司在限定时间内没有收到成功支付通知，则会关闭交易，关闭后该笔交易若付款方支付成功的情况下，会自动原路退款至付款方
                'business_code' => $business_code,
                'auth_code' => $code,
            ];
            if ($ways_source == 'alipay') {
                $biz_content['bank_type'] = '1903000'; //二维码行别，微信-1902000,支付宝-1903000,中国银联-9001002,苏宁-1905000
                $biz_content['scene'] = 'bar_code'; //支付场景,条码支付取值:bar_code;声波支付取值:wave_code.注:当bank_type域为支付宝-1903000时,为必填
            } elseif ($ways_source == 'weixin') {
                $biz_content['bank_type'] = '1902000';
            } elseif ($ways_source == 'unionpay') {
                $biz_content['bank_type'] = '9001002';
                $biz_content['device_info'] = $device_id;
            }
            $req_data['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE);
            $req_data = $this->keySort($req_data);
            $signStr = $this->SplicingString($req_data);
            Log::info('银盛支付-付款码支付-加签入参');
            Log::info($signStr);
            $sign = $this->pay_sign_encrypt($signStr, $private_key, $pfx_password);
            $req_data['sign'] = trim($sign['check']);
            Log::info('银盛支付-付款码支付-入参');
            Log::info($req_data);
            $res = $this->post_url($this->_url, $req_data, $public_key, 'ysepay_online_barcodepay_response'); //1-成功;2-失败
            Log::info('银盛支付-付款码支付-结果');
            Log::info($res);
            //业务成功
            if ($res['status'] == 1) {
                $return_data = $res['data'];
                if (isset($return_data['trade_status'])) {
                    //交易成功，且可对该交易做操作，如：多级分润、退款等
                    if ($return_data['trade_status'] == 'TRADE_SUCCESS') {
                        return [
                            'status' => 1,
                            'message' => '交易成功',
                            'data' => $return_data
                        ];
                    } //交易创建,等待买家付款
                    elseif ($return_data['trade_status'] == 'WAIT_BUYER_PAY') {
                        return [
                            'status' => 2,
                            'message' => '等待买家付款',
                            'data' => $return_data
                        ];
                    } //在指定时间段内未支付时关闭的交易;客户主动关闭订单
                    elseif ($return_data['trade_status'] == 'TRADE_CLOSED') {
                        return [
                            'status' => 4,
                            'message' => '客户主动关闭订单',
                            'data' => $return_data
                        ];
                    }  //交易正在处理中，可对该交易做查询，避免重复支付
                    elseif ($return_data['trade_status'] == 'TRADE_PROCESS') {
                        return [
                            'status' => 2,
                            'message' => '交易正在处理中',
                            'data' => $return_data
                        ];
                    } //部分退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_PART_REFUND') {
                        return [
                            'status' => 6,
                            'message' => '部分退款成功',
                            'data' => $return_data
                        ];
                    } //全部退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_ALL_REFUND') {
                        return [
                            'status' => 7,
                            'message' => '全部退款成功',
                            'data' => $return_data
                        ];
                    }
                } else {
                    return [
                        'status' => 2,
                        'message' => isset($return_data['sub_msg']) ? $return_data['sub_msg'] : '业务异常',
                        'data' => $return_data
                    ];
                }
            } else {
                return [
                    'status' => 2,
                    'message' => isset($res['message']) ? $res['message'] : '银盛支付付款码支付,未知错误'
                ];
            }

        } catch (\Exception $ex) {
            Log::info('银盛支付-被扫-error');
            Log::info($ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine());
            return [
                'status' => -1,
                'message' => '系统繁忙，请稍候再试'
            ];
        }
    }


    //二维码支付 -1系统错误 1-交易成功 2-失败 3-等待买家付款 4-客户主动关闭订单 5-交易正在处理中 6-部分退款成功 7-全部退款成功
    public function send_qr($data)
    {
        try {
            $partner_id = $data['partner_id']; //商户号
            $return_url = $data['return_url'] ?? ''; //可空,同步通知地址
            $out_trade_no = $data['out_trade_no']; //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天,且只能由大小写英文字母、数字、下划线及横杠组成
            $body = $data['body']; //商品的标题/交易标题/订单标题/订单关键字等。该参数最长为 250 个汉字
            $total_amount = $data['total_amount']; //订单的资金总额，单位为 RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。Number(10,2)指10位长度，2位精度
            $store_name = $data['store_name']; //收款方银盛支付客户名
            $business_code = $data['business_code']; //业务代码
            $ways_source = $data['ways_source']; //
            $public_key = isset($data['public_key']) ? app_path('Api/Controllers/YinSheng/') . $data['public_key'] : ''; //验签公钥
            $private_key = isset($data['private_key']) ? app_path('Api/Controllers/YinSheng/') . $data['private_key'] : ''; //加签私钥
            $pfx_password = $data['pfx_password']; //商户私钥证书密码
            $req_data = array();
            $req_data['method'] = 'ysepay.online.qrcodepay'; //接口名称


            $req_data['partner_id'] = $partner_id;
            $req_data['timestamp'] = date('Y-m-d H:i:s', time());
            $req_data['charset'] = $this->_charset;
            $req_data['sign_type'] = $this->_sign_type;
            $req_data['notify_url'] = url('/api/yinsheng/pay_notify_url');
            $req_data['version'] = $this->_version;
            if ($return_url) $req_data['return_url'] = $return_url;

            $biz_content_arr = array(
                "is_minipg" => 2,
                "out_trade_no" => $out_trade_no,
                "shopdate" => $this->datetime2string(date('Ymd')),
                "subject" => $body,
                "total_amount" => $total_amount,
                "seller_id" => $data['seller_id'],
//                "seller_name" => $store_name,
                "timeout_express" => "24h", //设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭。(需申请业务权限，权限未开通情况下该参数不生效，默认未付款交易的超时时间为7d)取值范围：1m～15d。m-分钟，h-小时，d-            天。该参数数值不接受小数点，如 1.5h，可转换为 90m。注意：设置了未付款交易超时时间的情况下，若我司在限定时间内没有收到成功支付通知，则会关闭交易，关闭后该笔交易若付款方支付成功的情况下，会自动原路退款至付款方
                "business_code" => $business_code,
            );
            if ($ways_source == 'alipay') {
                $biz_content_arr['bank_type'] = '1903000'; //二维码行别，微信-1902000,支付宝-1903000,QQ扫码-1904000,银联扫码-9001002,招商银行-3085840

            } elseif ($ways_source == 'weixin') {
                
                
                $all = request()->all();
                 error_log(date('Y-m-d H:i:s')." 【银盛主扫】： ".json_encode($all['open_id'])."\n\n", 3, "/tmp/". 'yc-add-mch'.date('Ymd').".log");
                $data['open_id'] = $all['open_id'];
                $biz_content_arr['bank_type'] = '1902000';
                $req_data['method'] = 'ysepay.online.weixin.pay'; //接口名称
                $biz_content_arr['appid']=$data['appid'];
                $biz_content_arr['sub_openid']=$data['open_id'];
            } elseif ($ways_source == 'unionpay') {
                $biz_content_arr['bank_type'] = '9001002';
            }
            
            Log::info('-----------', $biz_content_arr);
            $req_data['biz_content'] = json_encode($biz_content_arr, JSON_UNESCAPED_UNICODE); //构造字符串
            Log::info('银盛支付-二维码支付-键值排序值');
            Log::info($req_data);
            $req_data = $this->keySort($req_data);
            Log::info('银盛支付-二维码支付-拼接前参数');
            Log::info($req_data);
            $signStr = $this->SplicingString($req_data);
            Log::info('银盛支付-二维码支付-加签前参数');
            Log::info($signStr);
            $sign = $this->pay_sign_encrypt($signStr, $private_key, $pfx_password); //签名加密
            $req_data['sign'] = trim($sign['check']);
            Log::info('银盛支付-二维码支付-入参');
            Log::info($req_data);
            $res = $this->sendQrCurlRequest($req_data, $public_key, $ways_source); //1-成功 2-失败
            Log::info('银盛支付-二维码支付-结果');
            Log::info($res);
            //业务成功
            if ($res['status'] == 1) {
                $return_data = json_decode($res['data'], true);
                if (isset($return_data['trade_status'])) {
                    //交易成功，且可对该交易做操作，如：多级分润、退款等
                    if ($return_data['trade_status'] == 'TRADE_SUCCESS') {
                        return [
                            'status' => 1,
                            'message' => '交易成功',
                            'data' => $return_data
                        ];
                    } //交易创建,等待买家付款
                    elseif ($return_data['trade_status'] == 'WAIT_BUYER_PAY') {
                        return [
                            'status' => 1,
                            'message' => '等待买家付款',
                            'data' => $return_data
                        ];
                    } //在指定时间段内未支付时关闭的交易;客户主动关闭订单
                    elseif ($return_data['trade_status'] == 'TRADE_CLOSED') {
                        return [
                            'status' => 4,
                            'message' => '客户主动关闭订单',
                            'data' => $return_data
                        ];
                    }  //交易正在处理中，可对该交易做查询，避免重复支付
                    elseif ($return_data['trade_status'] == 'TRADE_PROCESS') {
                        return [
                            'status' => 5,
                            'message' => '交易正在处理中',
                            'data' => $return_data
                        ];
                    } //部分退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_PART_REFUND') {
                        return [
                            'status' => 6,
                            'message' => '部分退款成功',
                            'data' => $return_data
                        ];
                    } //全部退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_ALL_REFUND') {
                        return [
                            'status' => 7,
                            'message' => '全部退款成功',
                            'data' => $return_data
                        ];
                    }
                } else {
                    return [
                        'status' => 2,
                        'message' => isset($return_data['sub_msg']) ? $return_data['sub_msg'] : '业务异常',
                        'data' => $return_data
                    ];
                }
            } else {
                return [
                    'status' => 2,
                    'message' => isset($res['message']) ? $res['message'] : '二维码支付 unknown error'
                ];
            }
        } catch (\Exception $ex) {
            Log::info('银盛支付-二维码支付-error');
            Log::info($ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine());
            return [
                'status' => -1,
                'message' => '系统繁忙，请稍候再试'
            ];
        }
    }


    //JSAPI支付  -1系统错误 1-成功 2-失败
    public function qr_submit($data)
    {
        try {
            $partner_id = $data['partner_id']; //商户号
            $sub_openid = $data['sub_openid']; //
            $out_trade_no = $data['out_trade_no']; //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天,且只能由大小写英文字母、数字、下划线及横杠组成
            $body = $data['body']; //商品的标题/交易标题/订单标题/订单关键字等。该参数最长为 250 个汉字
            $total_amount = $data['total_amount']; //订单的资金总额，单位为 RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。Number(10,2)指10位长度，2位精度
            $store_name = $data['store_name']; //收款方银盛支付客户名
            $business_code = $data['business_code']; //业务代码
            $ways_source = $data['ways_source']; //支付方式
            $attach = $data['attach']; //

            $req_data = [
                'method' => 'ysepay.online.jsapi.pay',
                'partner_id' => $partner_id, //商户号
                'timestamp' => date('Y-m-d H:i:s'), //交易开始时间
                'charset' => $this->_charset,
                'sign_type' => $this->_sign_type, //签名类型
                'notify_url' => url('/api/yinsheng/pay_notify_url'), //回调地址
                'version' => $this->_version, //接口版本号
            ];
            $biz_content = [
                'out_trade_no' => $out_trade_no,
                'subject' => $body,
                'total_amount' => $total_amount, //金额 单位 元
                'seller_id' => $partner_id, // 收款方银盛支付用户号（商户号）
                'seller_name' => $store_name, //收款方银盛支付客户名（注册时公司名称）
                'timeout_express' => '30m', //超时关闭  30分钟
                'business_code' => $business_code,
                'extra_common_param' => $attach, //回传参数
                'sub_openid' => $sub_openid
            ];
            $req_data['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE);
            $req_data['sign'] = $this->sign($req_data);
            Log::info('银盛支付-JSAPI支付-入参');
            Log::info($req_data);
            $res = $this->curlPost($this->_url, $req_data);
            Log::info('银盛支付-JSAPI支付-结果');
            Log::info($res);
            //业务成功
            if ($res['status'] == 1) {
                $return_data = json_decode($res['data'], true);
                return [
                    'status' => 1,
                    'message' => '交易成功',
                    'data' => $return_data
                ];
            } else {
                return [
                    'status' => 2,
                    'message' => $res['message']
                ];
            }
        } catch (\Exception $ex) {
            Log::info('银盛支付-JSAPI支付-error');
            Log::info($ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine());
            return $this->responseDataJson(-1);
        }
    }


    /**
     * 查询订单 -1系统错误 1-成功 2-失败
        partner_id      //渠道代理ID
        seller_id       //渠道商户ID
        out_trade_no    //原交易单号
        public_key  	//公钥
        private_key 	//私钥
        pfx_password	//私钥密码
     * @param $data
     * @return array
     */
    public function order_query($data)
    {
        try {
            $req_data = [
                'method' => 'ysepay.online.trade.order.query', //接口类型
                'partner_id' => $data['partner_id'], //
                'timestamp' => date('Y-m-d H:i:s', time()), //32,发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
                'charset' => $this->_charset, //商户网站使用的编码格式
                'sign_type' => $this->_sign_type,
                'version' => $this->_version //接口版本
            ];
            $biz_content = [
                'out_trade_no' => $data['out_trade_no'],
                'shopdate' => $this->datetime2string(date('Ymd')), //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
//                'trade_no' => $data['trade_no'],
                'seller_id' => $data['seller_id'], //收款方银盛支付用户号(商户号)
            ];
            $req_data['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE);
            $public_key = isset($data['public_key']) ? app_path('Api/Controllers/YinSheng/') . $data['public_key'] : ''; //验签公钥
            $private_key = isset($data['private_key']) ? app_path('Api/Controllers/YinSheng/') . $data['private_key'] : ''; //加签私钥
            $req_data = $this->keySort($req_data);
            $signStr = $this->SplicingString($req_data);
            $sign = $this->pay_sign_encrypt($signStr, $private_key, $data['pfx_password']);
            $req_data['sign'] = trim($sign['check']);
            $res = $this->post_url($this->_url, $req_data, $public_key, 'ysepay_online_trade_order_query_response');
            if ($res['status'] == 1) {
                $return_data = $res['data'];
                $return_data['channel_send_sn'] = '';
                if (isset($return_data['pay_detail_list'])){
                    $pay_detail_list = $return_data['pay_detail_list'];
                    $return_data['channel_send_sn'] = $pay_detail_list[0]['channel_send_sn']??"";
                    unset($return_data['pay_detail_list']);
                }
                if (isset($return_data['trade_status'])) {
                    //交易成功，且可对该交易做操作，如：多级分润、退款等
                    if ($return_data['trade_status'] == 'TRADE_SUCCESS') {
                        return [
                            'status' => 1,
                            'message' => '交易成功',
                            'data' => $return_data
                        ];
                    } //交易创建,等待买家付款
                    elseif ($return_data['trade_status'] == 'WAIT_BUYER_PAY') {
                        return [
                            'status' => 3,
                            'message' => '等待买家付款',
                            'data' => $return_data
                        ];
                    } //在指定时间段内未支付时关闭的交易;客户主动关闭订单
                    elseif ($return_data['trade_status'] == 'TRADE_CLOSED') {
                        return [
                            'status' => 4,
                            'message' => '客户主动关闭订单',
                            'data' => $return_data
                        ];
                    }  //交易正在处理中，可对该交易做查询，避免重复支付
                    elseif ($return_data['trade_status'] == 'TRADE_PROCESS') {
                        return [
                            'status' => 5,
                            'message' => '交易正在处理中',
                            'data' => $return_data
                        ];
                    } //部分退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_PART_REFUND') {
                        return [
                            'status' => 6,
                            'message' => '部分退款成功',
                            'data' => $return_data
                        ];
                    } //全部退款成功
                    elseif ($return_data['trade_status'] == 'TRADE_ALL_REFUND') {
                        return [
                            'status' => 7,
                            'message' => '全部退款成功',
                            'data' => $return_data
                        ];
                    }
                } else {
                    return [
                        'status' => 2,
                        'message' => isset($return_data['sub_msg']) ? $return_data['sub_msg'] : '业务异常',
                        'data' => $return_data
                    ];
                }

            } else {
                return [
                    'status' => 2,
                    'message' => isset($res['message']) ? $res['message'] : '银盛支付订单查询,未知错误'
                ];
            }
        } catch (\Exception $ex) {
            Log::info('银盛支付-订单查询-error');
            Log::info($ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine());
            return [
                'status' => -1,
                'message' => '系统繁忙，请稍候再试'
            ];
        }
    }


    /**
     * 撤销订单(仅付款码支付) -1系统错误 1-成功 2-失败
     *
     * @param $data
     * @return array
     */
    public function reverse($data)
    {
        try {
            $mch_id = $data['mch_id'];
            $out_trade_no = $data['out_trade_no'];
            $private_rsa_key = $data['private_rsa_key'];
            $public_rsa_key = $data['public_rsa_key'];

            $req_data = [
                'service' => 'unified.micropay.reverse', //接口类型
                'sign_type' => 'RSA_1_256', //签名类型，取值RSA_1_256或RSA_1_1
                'mch_id' => $mch_id, //商户号，由平台分配
                'out_trade_no' => $out_trade_no, //商户系统内部的订单号,5到32个字符、只能包含字母数字或者下划线，区分大小写，每次下单请求确保在商户系统唯一
                'nonce_str' => $this->nonceStr() //随机字符串，不长于 32 位
            ];
            $res = $this->call($req_data, $private_rsa_key, $public_rsa_key); //1-成功;2-失败
//            Log::info('银盛支付-撤销订单-结果');
//            Log::info($res);
            //业务成功
            if ($res['status'] == 1) {
                $return_data = json_decode($res['data'], true);
                if (isset($return_data['retry_flag']) && $return_data['retry_flag'] == 'Y') { //N表示不用再重试，Y表示需要重试
                    return [
                        'status' => 2,
                        'message' => $return_data['err_msg'] ?? '撤销结果未知，请重试',
                        'data' => $return_data
                    ];
                }

                return [
                    'status' => 1,
                    'message' => $return_data['err_msg'] ?? '撤销成功',
                    'data' => $return_data
                ];
            } else {
                return [
                    'status' => 2,
                    'message' => $res['message'] ?? '订单撤销失败'
                ];
            }
        } catch (\Exception $ex) {
            return [
                'status' => 0,
                'message' => $ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine(),
            ];
        }
    }


    /**
     * 申请退款 0-系统错误 1-成功 2-退款失败
        partner_id      //渠道代理ID
        out_trade_no    //原交易单号
        refund_amount   //退款金额
        refund_no       //退款单号
        public_key  	//公钥
        private_key 	//私钥
        pfx_password	//私钥密码
     * @param $data
     * @return array
     */
    public function refund($data)
    {
        try {
            $req_data = [
                'method' => 'ysepay.online.trade.refund', //接口类型
                'partner_id' => $data['partner_id'], //
                'timestamp' => date('Y-m-d H:i:s', time()), //32,发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
                'charset' => $this->_charset, //商户网站使用的编码格式
                'sign_type' => $this->_sign_type,
                'version' => $this->_version, //接口版本
                'notify_url' => url('/api/yinsheng/refund_notify_url'),//回调地址
            ];
            $biz_content = [
                'out_trade_no' => $data['out_trade_no'],//商户原交易订单号
                'shopdate' => $this->datetime2string(date('Ymd')), //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
                'refund_amount' => $data['refund_amount'],
                'refund_reason' => '退款',
                'out_request_no' => $data['out_trade_no'].'12',//商户系统生成的退款订单号
            ];
            //Log::info($biz_content);
            $req_data['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE);
            $public_key = isset($data['public_key']) ? app_path('Api/Controllers/YinSheng/') . $data['public_key'] : ''; //验签公钥
            $private_key = isset($data['private_key']) ? app_path('Api/Controllers/YinSheng/') . $data['private_key'] : ''; //加签私钥
            $req_data = $this->keySort($req_data);
            $signStr = $this->SplicingString($req_data);
            $sign = $this->pay_sign_encrypt($signStr, $private_key, $data['pfx_password']);
            $req_data['sign'] = trim($sign['check']);
            $res = $this->post_url($this->_url, $req_data, $public_key, 'ysepay_online_trade_refund_response');
            //业务成功
            if ($res['status'] == 1) {
                if ($res['data']['code'] !== "10000") {
                    return [
                        'status' => 2,
                        'message' => $res['data']['sub_msg'] ?? '退款失败'
                    ];
                } else {
                    return [
                        'status' => 1,
                        'message' => $res['data']['sub_msg'],
                        'data' => $res['data']
                    ];
                }
            } else {
                return [
                    'status' => 2,
                    'message' => $res['message'] ?? '退款失败'
                ];
            }
        } catch (\Exception $ex) {
            return [
                'status' => 0,
                'message' => $ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine(),
            ];
        }
    }


    //退款查询 -1系统错误 1-成功 2-退款失败 3-退款处理中
    public function refund_query($data)
    {
        try {
            $mch_id = $data['mch_id'];
            $out_trade_no = $data['out_trade_no'];
            $private_rsa_key = $data['private_rsa_key'];
            $public_rsa_key = $data['public_rsa_key'];
            $req_data = [
                'service' => 'unified.trade.refundquery', //接口类型
                'sign_type' => 'RSA_1_256', //签名类型，取值RSA_1_256或RSA_1_1
                'mch_id' => $mch_id, //商户号，由平台分配
                'out_trade_no' => $out_trade_no, //商户系统内部的订单号
                'out_refund_no' => $out_trade_no, //如果是支付宝，refund_id、out_refund_no必填其中一个
                'nonce_str' => $this->nonceStr() //随机字符串，不长于 32 位
            ];
            $res = $this->call($req_data, $private_rsa_key, $public_rsa_key); //1-成功;2-失败
//            Log::info('银盛支付-退款查询-结果');
//            Log::info($res);
            //业务成功
            if ($res['status'] == 1) {
                $return_data = json_decode($res['data'], true);
                $count = (int)$return_data['refund_count'] - 1;
                $refund_status = $return_data['refund_status_' . $count];
                $refund_status_info = (isset($return_data['refund_status_info_' . $count]) && !empty($return_data['refund_status_info_' . $count])) ? $return_data['refund_status_info_' . $count] : '';
                //退款成功
                if ($refund_status == 'SUCCESS') {
                    return [
                        'status' => 1,
                        'message' => '退款成功',
                        'data' => $return_data
                    ];
                } //退款失败
                elseif ($refund_status == 'FAIL') {
                    return [
                        'status' => 2,
                        'message' => $refund_status_info ? $refund_status_info : '退款失败',
                        'data' => $return_data
                    ];
                } //退款处理中
                elseif ($refund_status == 'PROCESSING') {
                    return [
                        'status' => 3,
                        'message' => $refund_status_info ? $refund_status_info : '退款处理中',
                        'data' => $return_data
                    ];
                } //转入代发，退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，资金回流到商户的现金帐号，需要商户人工干预，通过线下或者平台转账的方式进行退款
                elseif ($refund_status == 'CHANGE') {
                    return [
                        'status' => 4,
                        'message' => $refund_status_info ? $refund_status_info : '转入代发，退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，资金回流到商户的现金帐号，需要商户人工干预，通过线下或者平台转账的方式进行退款',
                        'data' => $return_data
                    ];
                } else {
                    return [
                        'status' => 2,
                        'message' => $refund_status_info ? $refund_status_info : '退款结果未知',
                        'data' => $return_data
                    ];
                }
            } else {
                return [
                    'status' => 2,
                    'message' => $res['message'] ?? '退款查询错误'
                ];
            }

        } catch (\Exception $ex) {
            return [
                'status' => 0,
                'message' => $ex->getMessage() . ' | ' . $ex->getFile() . ' | ' . $ex->getLine(),
            ];
        }
    }


}
